package com.kakaxi.mybilibili.utils;

import android.util.Log;

import java.util.Locale;

/**
 * 日志打印工具类
 * 此日志工具类为了方便打印做到了最简,而且也提供了打印开关
 * 由于打印日志会影响到应用程序,因此发布程序时把打印开关关掉比较好
 * Created by kakaxi on 16/8/12.
 */

public class LogUtil {

    /** 啰嗦日志打印开关 **/
    private static final boolean LOGV = true;
    /** 测试日志打印开关 **/
    private static final boolean LOGD = true;
    /** 提醒日志打印开关 **/
    private static final boolean LOGI = true;
    /** 警告日志打印开关 **/
    private static final boolean LOGW = true;
    /** 出错日志打印开关 **/
    private static final boolean LOGE = true;

    /**
     * 打印啰嗦分类的日志
     *
     * @param mess 日志信息
     */
    public static void v(String mess) {
        if (LOGV) {
            Log.v(getTag(), buildMessage(mess));
        }
    }

    /**
     * 打印测试分类的日志
     *
     * @param mess 日志信息
     */
    public static void d(String mess) {
        if (LOGD) {
            Log.d(getTag(), buildMessage(mess));
        }
    }

    /**
     * 打印提醒分类的日志
     *
     * @param mess 日志信息
     */
    public static void i(String mess) {
        if (LOGI) {
            Log.i(getTag(), buildMessage(mess));
        }
    }


    /**
     * 打印警告分类的日志
     *
     * @param mess 日志信息
     */
    public static void w(String mess) {
        if (LOGW) {
            Log.w(getTag(), buildMessage(mess));
        }
    }


    /**
     * 打印错误分类的日志
     *
     * @param mess 日志信息
     */
    public static void e(String mess) {
        if (LOGE) {
            Log.e(getTag(), buildMessage(mess));
        }
    }


    /**
     * 获取调用者的类名
     *
     * @return
     */
    private static String getTag() {
        StackTraceElement[] trace = new Throwable().fillInStackTrace().getStackTrace();
        String callingClass = "";
        for (int i = 2; i < trace.length; i++) { // 调用者放在第三个元素以及之后
            Class<?> clazz = trace[i].getClass();
            if (!clazz.equals(LogUtil.class)) {
                // 获取使用此工具的类名,类名包括了包名因此截取最后一个小数点后的类名
                callingClass = trace[i].getClassName();
                callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1);
                break;
            }
        }
        return callingClass;
    }

    /**
     * 格式化打印出的日志信息
     *
     * @param msg 打印日志信息
     * @return
     */
    private static String buildMessage(String msg) {
        StackTraceElement[] trace = new Throwable().fillInStackTrace().getStackTrace();
        String caller = "";
        int line = -1;
        for (int i = 2; i < trace.length; i++) {
            Class<?> clazz = trace[i].getClass();
            if (!clazz.equals(LogUtil.class)) {
                // 获取调用此工具的方法名和行数
                caller = trace[i].getMethodName();
                line = trace[i].getLineNumber();
                break;
            }
        }
        // 格式化输出信息, 增加了线程,方法名和行数
        return String.format(Locale.CHINA, "Thread:%d, method:%s, line:%d, message:%s", Thread
                        .currentThread().getId(), caller,
                line, msg);
    }

}
